package main

import (
	"fmt"
	sentinel "github.com/alibaba/sentinel-golang/api"
	"github.com/alibaba/sentinel-golang/core/base"
	"github.com/alibaba/sentinel-golang/core/config"
	"github.com/alibaba/sentinel-golang/core/flow"
	"github.com/alibaba/sentinel-golang/logging"
	"log"
)

func main() {
	// We should initialize Sentinel first.
	conf := config.NewDefaultConfig()
	// for testing, logging output to console
	conf.Sentinel.Log.Logger = logging.NewConsoleLogger()
	//方式一： 通过配置文件创建
	err := sentinel.InitWithConfig(conf)
	//方式二： 通过默认创建
	//err :sentinel.InitDefault()
	if err != nil {
		log.Fatal(err)
	}

	// TokenCalculateStrategy配置flow.Direct，Threshold配置10，StatIntervalInMs配置100，表示1s钟10个流量
	_, err = flow.LoadRules([]*flow.Rule{{
		Resource:               "lqz-test",      //资源名，即规则的作用目标
		TokenCalculateStrategy: flow.Direct,     //当前流量控制器的Token计算策略。Direct表示直接使用字段 Threshold 作为阈值；WarmUp表示使用预热方式计算Token的阈值,三种方式
		ControlBehavior:        flow.Throttling, //Throttling表示匀速排队
		Threshold:              10,              //表示流控阈值；如果字段 StatIntervalInMs 是1000(也就是1秒)，那么Threshold就表示QPS，流量控制器也就会依据资源的QPS来做流控
		StatIntervalInMs:       1000,            //规则对应的流量控制器的独立统计结构的统计周期。如果StatIntervalInMs是1000，也就是统计QPS
	}})

	if err != nil {
		log.Fatalf("Unexpected error: %+v", err)
		return
	}

	for {
		// base.Inbound表示入口流量控制，Outbound表示出口流量控制
		e, b := sentinel.Entry("lqz-test", sentinel.WithTrafficType(base.Inbound))
		if b != nil {
			// Blocked. We could get the block reason from the BlockError.
			fmt.Println("失败")
		} else {
			// Passed, wrap the logic here.
			fmt.Println("通过")
			// Be sure the entry is exited finally.
			e.Exit()
		}
		//time.Sleep(100*time.Millisecond) // 100 毫秒发送一次，都能通过，如果去掉，就只能通过一个
	}
}
